package com.leonzhangxf.aop.introduction;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.DeclareParents;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * The demo for introduction.
 * <p>
 * 通过声明另外一个接口，以及提供默认实现，来让代理实例，在实现被代理对象的接口的同时，
 * 也实现了指定的另外一个接口（introduction），从而提供额外的操作。
 * <p>
 * 这样也不用让被代理对象真实的去实现这另外一个introduction接口。
 * 类似于包装器，提供了额外的功能。
 *
 * @author leonzhangxf
 * @date 20190504
 */
@Aspect
@Configuration
@EnableAspectJAutoProxy
public class UsageTracking {

    @DeclareParents(value = "com.leonzhangxf.aop.introduction.service.*+",
        defaultImpl = DefaultUsageTracked.class)
    public static UsageTracked mixin;

    @Pointcut("execution(* com.leonzhangxf.aop.introduction.service.*.*(..))")
    public void servicePointcut() {

    }

    @Before("servicePointcut() && this(usageTracked)")
    public void recordUsage(UsageTracked usageTracked) {
        usageTracked.track();
    }
}
